package exercise;

public class EX04_OOP {

	// 자릿수 구분 문자 _
	// 정수 리터럴이 너무 길면 가독성에 문제 있음
	// JDK 7에 새롭게 추가된 기능 중 하나로 3자릿수 마다 _를 사용할 수 있다

	// 변수의 종류
	// 멤버member 변수
	// - class 블록내에 선언한 변수
	// - 해당 클래스를 통해서만 사용가능한 변수
	// 인스턴스instance/object 변수
	// - 객체를 가리키는 변수
	// - 클래스와 new 연산자를 사용한 문장의 실행 결과물
	
	// 생성자constructor
	// 생성자는 객체를 생성하는데 사용하는 특별한 메서드
	// 모든 클래스는 하나 이상의 생성자가 있어야함
	// 설령 메서드를 작성하지 않았더라도 컴파일러가 자동으로 만들어서 넣어줌
	// 생성자는 일반 메서드와는 달리 void나 return을 사용하지 않음

	public static void main(String[] args) {
		Retangle r1 = new Retangle();
		r1.width = 4;
		r1.height = 40;
		r1.color = "red";

		System.out.println(r1.getArea());
		System.out.println(r1.getPerimeter());

		Retangle r2 = new Retangle();
		r2.width = 3.5F;
		r2.height = 35.9F;
		r2.color = "orange";

		System.out.println(r2.getArea());
		System.out.println(r2.getPerimeter());

		Fan f1 = new Fan();
		f1.radius = 10;
		f1.color = "yellow";
		f1.speed = f1.FAST;
		f1.on = true;

		System.out.println(f1.showFanInfo());

		Fan f2 = new Fan();
		f2.radius = 5;
		f2.color = "blue";
		f2.speed = f2.MEDIUM;
		f2.on = false;

		System.out.println(f2.showFanInfo());

		Account a1 = new Account();
		a1.aid = 1122;
		a1.balance = 20000;
		a1.interestRate = 4.5F;
		a1.dateCreated = "2013-11-06 10:25:26";

		a1.withDraw(2500);
		a1.withDraw(3000);
		a1.show();

		Stock st1 = new Stock();
		st1.sname = "경영기술";
		st1.previousClosingPrice = 1_000_000;
		st1.currentPrice = 750_000;

		st1.getChangePercent();

	} // main

} // class

// #01
class Retangle {
	float width = 1.0F;
	float height = 1.0F;
	String color = "white";

	float getArea() {
		return width * height;
	}

	float getPerimeter() {
		return width * 2 + height * 2;
	}

}

// #02
class Fan {
	final int SLOW = 1;
	final int MEDIUM = 2;
	final int FAST = 3;
	int speed = SLOW;
	boolean on = false;
	float radius = 5.0F;
	String color = "blue";
	String msg;

	String showFanInfo() {
		String sp = "";
		switch (speed) {
		case 3:
			sp = "최고속도";
			break;
		case 2:
			sp = "중간속도";
			break;
		case 1:
			sp = "최저속도";
			break;
		}

		if (on == true) {
			msg = "속도 : " + sp + "/ 색상 : " + color + "/ 지름 : " + radius + "/ 작동중";
		} else {
			msg = "색상 : " + color + "/ 지름 : " + radius + "/ 꺼져있음";
		}
		return msg;
	}

}

// #03
class Account {
	int aid = 0;
	int balance = 0;
	float interestRate = 0;
	String dateCreated;

	float getMonthlyInterestRate() {
		return interestRate / 12;
	}

	int withDraw(int i) {
		return balance -= i;
	}
	
//	int withDraw(int i) {
//		return balance - i;
//	}	// call by value로 인해 예금 금액이 제대로 차감되지 않음

	int deposit(int i) {
		return balance += i;
	}

	void show() {
		System.out.println("잔액 : " + balance);
		System.out.println("월간 이자율 : " + this.getMonthlyInterestRate() + "%");
		System.out.println("통장 개설 날짜 : " + dateCreated);
	}

}

// #04
class Stock {
	String sname;
	int previousClosingPrice;
	int currentPrice;

	void getChangePercent() {
		System.out.print("주가 변동율 : ");
		System.out.print((((float)currentPrice/previousClosingPrice)-1)*100 + "%");

	}

}
